打造專屬 ChatGPT:OpenAI Chat Completions API 實戰指南 (20260601更新)
如果你想自己打造一個類似 ChatGPT 的應用,OpenAI 的 Chat Completions API 是很常見的入門介面。
它的核心概念很簡單:你把一組 messages 傳給模型,模型根據這些對話內容產生下一則 assistant 回覆。
但當你真的要把它做成產品,就會開始遇到更多參數與情境,例如:
- 要用哪個
model messages裡的developer、user、assistant、toolrole 怎麼設計- 要如何調整
temperature、top_p、max_completion_tokens - 要如何讓模型輸出 JSON 或符合 JSON Schema 的資料
- 要如何讓模型呼叫後端工具或內部 API
- 要如何做 streaming 串流回應
- 要如何記錄 token usage、metadata、user 與 request log
- 舊版
max_tokens、functions、function_call應該怎麼遷移
原本我把這些內容整理在同一篇文章中,但後來發現篇幅太長,不利於閱讀與維護。因此這次將內容拆成三篇系列文,分別介紹基礎參數、進階功能,以及正式產品中的回傳物件、除錯與實務設定。
這篇文章則作為系列總覽與快速查找入口。
系列文章目錄
打造專屬 ChatGPT(一):Chat Completions API 基礎參數解析
第一篇聚焦 Chat Completions API 的基礎參數與核心結構。
文章會從 Python SDK 最小可用範例開始,介紹 model、messages、developer / user / assistant / tool roles,以及 temperature、top_p、max_completion_tokens 等生成控制參數,幫助你建立 Chat Completions API 的基礎心智模型。
適合想先理解以下問題的讀者:
- Chat Completions API 是什麼?
- 如何用 Python SDK 發出第一個請求?
model和messages是什麼?developer、user、assistant、toolrole 差在哪裡?- 多輪對話為什麼要自己保存上下文?
temperature、top_p、max_completion_tokens如何影響模型輸出?
文章連結:
https://www.alfred.wiki/ai-gpt/custom-chatgpt-chat-completions-api-basics/
打造專屬 ChatGPT(二):結構化輸出、Tool Calling 與 Streaming
第二篇聚焦 Chat Completions API 的進階產品功能。
文章會介紹 response_format、json_object、json_schema、Tool Calling、streaming 串流回應,以及圖片、音訊、檔案等多模態輸入輸出,說明如何讓模型輸出結構化資料、呼叫後端工具,並支援即時聊天 UI。
適合想進一步實作以下功能的讀者:
- 讓模型穩定輸出 JSON
- 使用 JSON Schema 限制模型回傳格式
- 使用
tools與tool_choice讓模型呼叫後端函式 - 使用
parallel_tool_calls處理多工具呼叫 - 使用
stream=True建立即時聊天體驗 - 使用
stream_options.include_usage在串流結束時取得 token usage - 使用 content parts 處理圖片、音訊與檔案輸入
文章連結:
https://www.alfred.wiki/ai-gpt/custom-chatgpt-structured-outputs-tool-calling-streaming/
打造專屬 ChatGPT(三):回傳物件、除錯與實務設定
第三篇聚焦正式產品中的追蹤、除錯、回傳物件解析與實務設定。
文章會整理 store、metadata、user、service_tier、usage、logprobs、seed、system_fingerprint,並解析 chat.completion 與 chat.completion.chunk 回傳物件,最後補充 deprecated 參數與常見實務設定範例。
適合正在把 Chat Completions API 放進正式產品的讀者:
- 如何記錄 token usage 與成本
- 如何用
metadata標記功能、環境與 prompt version - 如何用
user標記終端使用者 - 如何理解
finish_reason - 如何解析
chat.completionresponse object - 如何解析 streaming 的
chat.completion.chunk - 如何使用
logprobs、top_logprobs分析輸出信心 - 如何用
seed與system_fingerprint做除錯 - 舊版
max_tokens、functions、function_call要怎麼遷移 - 不同產品情境應該如何組合參數
文章連結:
https://www.alfred.wiki/ai-gpt/custom-chatgpt-chat-completions-api-response-debugging-practice/
延伸閱讀:從 Chat Completions 轉向 Responses API
如果你是第一次接觸 OpenAI API,先理解 Chat Completions API 仍然很有價值,因為它能幫助你掌握 messages、roles、Tool Calling、Streaming、Structured Outputs 等核心概念。
不過,如果你現在要從零開始建立新的 OpenAI API 功能,也建議進一步了解 Responses API。Responses API 更像是 OpenAI API 新一代的統一入口,將 input、output、tools、structured output、streaming、多模態與 conversation state 整合在同一個 response workflow 中。
延伸文章:
https://www.alfred.wiki/ai-gpt/custom-chatgpt-responses-api-vs-chat-completions/
快速查找:你應該看哪一篇?
如果你是第一次接觸 Chat Completions API,建議先看第一篇。
如果你已經會發出基本請求,但想讓模型輸出 JSON、呼叫工具或支援 streaming,建議看第二篇。
如果你正在把功能放進正式產品,想處理 usage、metadata、log、回傳物件、除錯與舊參數遷移,建議看第三篇。
可以用這張表快速判斷:
| 需求 | 建議閱讀 |
|---|---|
| 發出第一個 Chat Completion 請求 | 第一篇 |
理解 model、messages、roles | 第一篇 |
調整 temperature、top_p、max_completion_tokens | 第一篇 |
| 讓模型輸出 JSON | 第二篇 |
| 使用 JSON Schema / Structured Outputs | 第二篇 |
| 讓模型呼叫後端工具 | 第二篇 |
| 實作 Tool Calling Agent | 第二篇 |
| 建立即時 streaming 聊天 UI | 第二篇 |
| 處理圖片、音訊、檔案輸入 | 第二篇 |
| 記錄 token usage 與成本 | 第三篇 |
使用 metadata、user、store | 第三篇 |
分析 chat.completion 回傳物件 | 第三篇 |
分析 chat.completion.chunk 串流物件 | 第三篇 |
使用 logprobs、seed、system_fingerprint 除錯 | 第三篇 |
遷移 max_tokens、functions、function_call | 第三篇 |
| 查找實務設定範例 | 第三篇 |
| 想理解 Responses API 和 Chat Completions 的差異 | Responses API 延伸篇 |
| 新專案想選 API 入口 | Responses API 延伸篇 |
| 想從 Chat Completions 逐步遷移到 Responses API | Responses API 延伸篇 |
Chat Completions API 參數快查表
下面是這個系列中會介紹的主要參數與用途。
| 類型 | 參數 | 用途 |
|---|---|---|
| 基礎參數 | model | 指定使用哪個模型 |
| 基礎參數 | messages | 提供對話上下文 |
| 訊息角色 | developer | 應用程式層級指令 |
| 訊息角色 | user | 使用者輸入 |
| 訊息角色 | assistant | 模型回覆 |
| 訊息角色 | tool | 工具執行結果 |
| 生成控制 | temperature | 控制輸出隨機程度 |
| 生成控制 | top_p | 控制候選 token 範圍 |
| 生成控制 | max_completion_tokens | 限制最多生成 token 數 |
| 生成控制 | presence_penalty | 鼓勵模型談新主題 |
| 生成控制 | frequency_penalty | 降低重複用詞 |
| 生成控制 | logit_bias | 調整特定 token 出現機率 |
| 輸出格式 | response_format | 控制輸出格式 |
| 輸出格式 | json_object | 要求輸出 valid JSON |
| 輸出格式 | json_schema | 要求輸出符合 JSON Schema |
| 工具呼叫 | tools | 定義模型可使用的工具 |
| 工具呼叫 | tool_choice | 控制模型是否使用工具 |
| 工具呼叫 | parallel_tool_calls | 控制是否允許平行工具呼叫 |
| 串流 | stream | 啟用串流回應 |
| 串流 | stream_options.include_usage | 串流結束時回傳 token usage |
| 多模態 | content parts | 支援文字、圖片、音訊、檔案輸入 |
| 多模態 | modalities | 指定輸出型態,例如文字或音訊 |
| 多模態 | audio | 設定音訊輸出格式與聲音 |
| 可觀測性 | store | 控制是否儲存 completion |
| 可觀測性 | metadata | 替請求加上功能、環境、版本等標籤 |
| 可觀測性 | user | 標記終端使用者 |
| 可觀測性 | service_tier | 指定服務處理層級 |
| 除錯分析 | logprobs | 回傳輸出 token 的 log probability |
| 除錯分析 | top_logprobs | 回傳候選 token 機率 |
| 除錯分析 | seed | 嘗試讓輸出更可重現 |
| 除錯分析 | system_fingerprint | 後端系統設定指紋 |
| Legacy | max_tokens | 舊版輸出長度控制,建議改用 max_completion_tokens |
| Legacy | functions | 舊版工具定義,建議改用 tools |
| Legacy | function_call | 舊版工具選擇,建議改用 tool_choice |
最小可用範例
如果只是要發出一個最基本的 Chat Completion 請求,可以這樣寫:
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-5.5",
messages=[
{
"role": "user",
"content": "請用一句話解釋 Chat Completions API 是什麼。"
}
],
)
print(completion.choices[0].message.content)
這個範例中最重要的是兩個參數:
model:指定要使用哪個模型。messages:指定模型要根據哪些對話內容產生回覆。
更完整的基礎說明,可以閱讀第一篇:
打造專屬 ChatGPT(一):Chat Completions API 基礎參數解析
什麼時候需要 response_format?
如果模型輸出是給人閱讀,通常可以使用一般文字輸出。
但如果模型輸出要交給程式解析,例如寫入資料庫、產生 API response、更新前端 UI 或建立後端流程,就建議使用 response_format。
常見選擇:
| 情境 | 建議 |
|---|---|
| 聊天回答 | 預設文字 |
| 簡單 JSON | json_object |
| 資料抽取 | json_schema |
| 表單欄位整理 | json_schema |
| 收據 OCR 結果整理 | json_schema |
| 後端流程輸入 | json_schema |
更完整的說明可以閱讀第二篇:
打造專屬 ChatGPT(二):結構化輸出、Tool Calling 與 Streaming
什麼時候需要 Tool Calling?
如果模型只需要根據使用者輸入回答,通常不需要 Tool Calling。
但如果模型需要查詢外部資料或執行後端邏輯,就可以使用 Tool Calling。
例如:
- 查詢訂單狀態
- 查詢旅程花費
- 查詢資料庫
- 呼叫內部 API
- 建立行事曆事件
- 取得即時資料
- 執行計算或格式轉換
Tool Calling 的核心觀念是:
模型不會真的執行工具。
模型只會產生工具呼叫請求,真正執行工具的是你的後端程式。
因此正式產品中一定要做:
- 參數驗證
- 權限檢查
- 錯誤處理
- 高風險操作的使用者確認
完整流程可以閱讀第二篇。
什麼時候需要 Streaming?
如果你正在做聊天 UI,通常會需要 streaming。
非串流模式下,模型會產生完整回答後才一次回傳。
串流模式下,模型會一段一段回傳文字,使用者可以即時看到內容出現。
串流適合:
- 聊天 UI
- 長文生成
- 即時客服回答
- 使用者正在等待的互動流程
串流不一定適合:
- 批次摘要
- 資料抽取
- 分類任務
- 後台背景工作
- 需要完整 JSON 後再處理的流程
更完整的 stream、stream_options.include_usage 與 chat.completion.chunk 說明,可以閱讀第二篇與第三篇。
正式產品要注意什麼?
如果只是寫 demo,能拿到模型回答就可以了。
但如果要放進正式產品,還需要考慮:
- token usage 與成本
- latency
- request log
- user tracking
- metadata
- prompt version
- service tier
- finish reason
- error handling
- streaming 中斷
- tool calling 錯誤
- deprecated 參數遷移
至少建議記錄:
| 欄位 | 用途 |
|---|---|
completion.id | 追蹤特定請求 |
model | 記錄實際使用模型 |
usage | token 與成本分析 |
finish_reason | 判斷是否正常停止 |
metadata | 標記功能、環境、版本 |
user | 標記終端使用者 |
service_tier | 分析服務層級 |
latency_ms | 分析效能 |
system_fingerprint | 協助可重現性分析 |
這些內容可以閱讀第三篇:
打造專屬 ChatGPT(三):回傳物件、除錯與實務設定
新舊參數對照
如果你看過舊版 Chat Completions API 教學,可能會看到一些 legacy 寫法。
新專案建議使用較新的參數名稱與流程:
| 舊用法 | 新建議用法 |
|---|---|
max_tokens | max_completion_tokens |
functions | tools |
function_call | tool_choice |
message.function_call | message.tool_calls |
role: "function" | role: "tool" |
system message | 新模型範例優先使用 developer message |
openai.ChatCompletion.create(...) | client.chat.completions.create(...) |
舊寫法仍然值得理解,因為你可能會維護舊專案或閱讀舊文章。
但如果是新專案,建議以目前官方文件與新的 SDK 寫法為準。
結語
Chat Completions API 看起來只是「傳入 messages,取得 assistant 回覆」,但真正做成產品時,它其實是一組可以控制模型行為的參數系統。
你可以用:
messages設計上下文temperature控制生成風格response_format取得結構化資料tools接上外部系統stream改善聊天體驗metadata與usage做產品追蹤logprobs、seed、system_fingerprint做除錯與分析
這個系列會從基礎到進階,再到正式產品維護,逐步整理 Chat Completions API 的主要參數與實務用法。
如果你是第一次接觸,建議從第一篇開始。
如果你已經有基本經驗,可以依照需求直接跳到第二篇或第三篇。
如果你已經看完 Chat Completions API 三篇系列,下一步可以閱讀「打造專屬 ChatGPT:從 Chat Completions 轉向 Responses API」,了解新專案為什麼可以優先考慮 Responses API,以及既有 Chat Completions 專案該如何分階段遷移。